package com.example.consumer;

import com.example.entity.Order;
import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;

import java.io.IOException;

@Service
@Slf4j
public class OrderConsumer {

    @RabbitListener(queues = "order.queue")
    public void handleOrder(Order order, Channel channel, Message message) throws IOException {
        try {
            String correlationId = message.getMessageProperties().getCorrelationId();
            log.info("order.queue处理订单：{}，{}", order,correlationId);
            // 模拟业务处理（耗时操作）
            // 这里添加实际的业务处理逻辑
            // 例如：更新数据库、调用其他服务、发送通知等

            // 模拟处理时间
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                throw new RuntimeException("订单处理被中断", e);
            }

            // 模拟偶尔的处理失败
            if (order.getUserId() != null && order.getUserId().contains("ERROR")) {
                throw new RuntimeException("模拟订单处理失败");
            }

            // 手动确认消息（deliveryTag：消息唯一标识；multiple：是否批量确认）
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
        } catch (Exception e) {
            log.error("处理订单失败：{}", order.getId(), e);
            // 拒绝消息（requeue：是否重新入队；此处设置为false则进入死信队列）
            channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, false);
        }
    }
}